﻿using System.Collections.Generic;
using System.Threading;
using System.Timers;
using Timer = System.Timers.Timer;

/*
 * 
 * 2014-2-20：为日志添加缓存功能
 * 
 *        功能：缓冲区 + 多线程 + 读写锁
 *        注意项:  ①根据不同类型进行相应的操作
 *                   ②根据不同的目标做相应的操作
 *                   
 *                   ③要添加信号量，如果上一次的Log还没有处理好，那么在下一次的处理将会延后
 
 */

namespace Ycg.Logging.Cache
{
    public class LogCache
    {
        private static object _obj = new object();
        public static readonly LogCache Instance = new LogCache();

        private LogInfo[] _copyLogCache;
        private Timer _timer = new Timer(5000);                     //这边需要可以配置的，这个要注意了
        private Queue<LogInfo> _logCache = new Queue<LogInfo>();

        private LogCache()
        {
            this._timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
            this._timer.Start();
        }

        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            this.WriteLog();
        }

        public void Add(LogInfo logInfo)
        {
            lock (_obj)
            {
                
            }
        }

        public void WriteLog()
        {
            lock (_obj)
            {
                this._copyLogCache = new LogInfo[this._logCache.Count];
                this._logCache.CopyTo(this._copyLogCache, default(int));
            }

            this.SyncWriteLog();
        }

        private void SyncWriteLog()
        {
            ThreadPool.QueueUserWorkItem(p =>
            {
                //★ 这边要实现一次性写入所有缓存的Log，使用StringBuilder进行拼接字符串

                foreach (LogInfo logInfo in this._copyLogCache)
                {
                    //这边要根据配置文件内容进行各种操作
                }

                _copyLogCache = null;
            });
        }
    }
}
